package study.Day_6;

/**
 * @Classname: Day_six
 * @Description: leetcode第六题
 * @Date: 2021/10/8
 * @Author: huwei
 *
 * 将一个给定字符串s根据给定的行数numRows，以从上往下、从左到右进行Z字形排列。
 * 比如输入字符串为 "PAYPALISHIRING"行数为3时，排列如下：
 *
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 *
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 * 请你实现这个将字符串进行指定行数变换的函数：
 * string convert(string s, int numRows);
 *
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 排列：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 *
 * 输出："PINALSIGYAHRPI"
 */
public class Day_six {
    public String convert(String s, int numRows) {
        // 如果只有1行或者字符串不存在就返回本身
        if (numRows == 1 || s.length() == 0) {
            return s;
        }
        // 用一个StringBuilder[]来接收处理的数据,数组的长度就是行数
        StringBuilder[] array = new StringBuilder[numRows];
        // 初始化
        for (int i = 0; i < array.length; i++) {
            array[i] = new StringBuilder();
        }
        int dir = 1;
        int index = 0;
        // 把字符串变成一个个的字符
        // 开始时将字符放进第一个数组中,第二次循环放进第二个数组中(dir为正)
        // 当到达最后一行后即numRows-1 == index,dir取负值,循环时将字符放进最后一个数组中,再次循环放进倒数第二个数组中
        // 当到达第一行即index= 0,dir又取负值,负负得正,又将字符放进第一个数组中,,再次循环将数组放进第二个数组中
        // 重复上面的方法,直到循环结束
        for (char c : s.toCharArray()) {
            array[index].append(c);
            index = index + dir;
            // 如果是最后一行或第一个行就取负值,实现翻转
            if (index == numRows - 1 || index == 0) {
                dir = -dir;
            }
        }
        // 将三个数组拼起来返回
        StringBuilder st = new StringBuilder();
        for(int i = 0;i<numRows;i++){
            st.append(array[i]);
        }
        return st.toString();
    }
}